Элемент управления закладка. Общая идея его такая. Создаем объект типа CtabCtrl. Потом добавляем закладки. К каждой закладке добавляем диалоговое окно. В виде классов это так: CTabCtrl - это сам класс, CDialog - это классы для закладок. Давайте попробуем сделать. Создаем приложение на базе диалогового окна, для простоты с именем TestTab. И добавляем на него сам элемент и две закладки, точно как в шаге "Шаг 203 - Использование CTabCtrl". Получаем две закладки в результате:

Каждой закладке нужно создать диалоговое окно. Давайте это сделаем. В ресурсах два диалоговых окна и два класса к ним. Имена классов CTabPage1 и CTabPage2. На первый диалог ради интереса элемент управлеия List, а на второй Edit. Стиль окон должен быть Child и лучше убрать все кнопки, чтобы диалог не закрывался когда вы нажимаете OK.

Для того, чтобы мы могли связать классы диалогов с окном свойств нам нужно получить доступ к этим классам. Давайте включим заголовочные файлы:
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include "TabPage1.h" #include "TabPage2.h" ///////////////////////////// // CTestTabDlg dialog
Объявим ссылки на эти классы:
class CTestTabDlg : public CDialog
{
......
// Implementation
protected:
HICON m_hIcon;
CTabPage1* Page1;
CTabPage2* Page2;
......
};
Создадим эти классы в конструкторе:
CTestTabDlg::CTestTabDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestTabDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestTabDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
Page1=new CTabPage1;
Page2=new CTabPage2;
}
И удалим при закрытии диалога:
BOOL CTestTabDlg::DestroyWindow()
{
delete Page1;
delete Page2;
return CDialog::DestroyWindow();
}
Теперь нужен код для создания этих диалогов:
BOOL CTestTabDlg::OnInitDialog()
{
......
// TODO: Add extra initialization here
TC_ITEM tci;
tci.mask = TCIF_TEXT;
tci.iImage = -1;
tci.pszText = "One";
m_Tabs.InsertItem(0, &tci);
tci.pszText = "Two";
m_Tabs.InsertItem(1, &tci);
tci.mask = TCIF_PARAM;
tci.lParam = (LPARAM)Page1;
m_Tabs.SetItem(0, &tci);
Page1->Create(CTabPage1::IDD, &m_Tabs);
Page1->SetWindowPos(NULL, 30, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
Page1->ShowWindow(SW_SHOW);
tci.mask = TCIF_PARAM;
tci.lParam = (LPARAM)Page2;
m_Tabs.SetItem(1, &tci);
Page2->Create(CTabPage2::IDD, &m_Tabs);
Page2->SetWindowPos(NULL, 30, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
Page2->ShowWindow(SW_HIDE);
return TRUE; // return TRUE unless you set the focus to a control
}
Воспользовавшись ClassWizard'ом нам теперь нужно перегрузить реакцию на смену закладки:
void CTestTabDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
int iTab = m_Tabs.GetCurSel();
TC_ITEM tci;
tci.mask = TCIF_PARAM;
m_Tabs.GetItem(iTab, &tci);
CWnd* pWnd = (CWnd *)tci.lParam;
pWnd->ShowWindow(SW_SHOW);
*pResult = 0;
}
void CTestTabDlg::OnSelchangingTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
int iTab = m_Tabs.GetCurSel();
TC_ITEM tci;
tci.mask = TCIF_PARAM;
m_Tabs.GetItem(iTab, &tci);
CWnd* pWnd = (CWnd *)tci.lParam;
pWnd->ShowWindow(SW_HIDE);
*pResult = 0;
}
Вот, если сейчас запустить приложение, то у нас будет две закладки, на которых разные элементы управления. Кода много. Но если Вы читали ранее, то с закладками более менее понятно, а добавилось только то, что каждую закладку мы связали с диалоговым окном. Это окно мы либо показываем либо прячем при смене закладки.